// 对象的扁平化

const obj = {
  a: 1,
  b: [1, 2, { c: 3 }, [4]],
  d: {
    e: 2,
    f: 3
  }
}

// {
//   a: 1,
//   'b[0]': 1,
//   'b[1]': 2,
//   'b[2].c': 3,
//   'b[3][0]': 4,
//   'd.e': 2,
//   'd.f': 3
// }

function flatObj(obj) {
  let res = {}

  function help(obj, oldKey) {
    for (let key in obj) {
      let newKey
      if (oldKey) {
        if (Array.isArray(oldKey)) {
          newKey = `${oldKey}[${key}]`
        } else {
          newKey = `${oldKey}.${key}`
        }
      } else {
        newKey = key
      }

      if (Object.prototype.toString.call(obj[key]) === '[object Object]' || Array.isArray(obj[key])) {
        help(obj[key], newKey)
      } else {
        res[newKey] = obj[key]
      }
    }
  }

  help(obj, '')
  return res
}

console.log(flatObj(obj));


